package ww;

public class J18_OOP4 {
	
	// static
	// 일반적으로 객체를 생성하려면
	// 생성자를 사용해야 함
	// 하지만, 생성자 없이도 객체를 바로 사용할수도 있음
	// static 예약어를 멤버 변수나 메서드에 사용하면 객체 생성없이 바로 클래스 사용
	// static 로 선언된 멤버변수는 클래스명.멤버변수 형태로 사용
	// static 로 선언된 메서드는 클래스명. 메서드 형태로 사용
	// static 으로 선언된 멤버변수를 
	// 클래스 (공용)변수라고 부르기도 함
	// 이것과 유사하게 c나 c++에서는 전역변수라 함
	
	// static으로 선언된 멤버변수는 main() 메서드가 호출되기 전에 먼저 메모리에 변수공간이 생성됨
	// 반면에 객체는  main()메서드가 호출되고  해당 클래스의 생성자가 호출되어야 만 변수공간이 생성
	
	// OOP 작성기법1
	// 프로그램 작성시 클래스는 용도에 따라 (값, 처리)에 따라
	// 최소 2개 이상으로 나누어 작성하는것을 추천
	// 값만을 저장하는 클래스 : value object 클래스
	// 값을 받아서 처리만 하는 클래스 : service 클래스
	
	// 인수 전달방식

	public static void main(String[] args) {
		Rent r20131107001 = new Rent();
		r20131107001.retno = 351;			// 대여번호
		r20131107001.bookno = 8754;		// 대여한 대상 번호
		r20131107001.memberno = 68;		// 대여한 사람 번호
		r20131107001.showRentinfo();	// 대여정보 출력
		
		
		
		// static 으로 선언된 클래스 사용
		StaticRent.bookno = 351;
		StaticRent.bookno = 22;
		StaticRent.memberno = 11;
		StaticRent.showRentinfo();
		
		// 성적데이터 초기화
		
		subngjuk sj = new subngjuk();
		sj.kor = 32;
		sj.eng = 45;
		sj.mat = 55;
		//sj.tot = sj.kor + sj.eng + sj.mat;
		sj.tot = sj.showtot();
		// 성적 대이터 초기화 2
		sungjukvo sjvo = new sungjukvo(99,98,90);
		sungjukservice s = new sungjukservice();
		sjvo.tot = s.getTotal(sjvo.kor, sjvo.eng, sjvo.mat);
		
		// 생성자를 쓰지않고 메서드 호출
		sjvo.tot = sungjukservice.getTotal2(sjvo.kor, sjvo.eng, sjvo.mat);
		System.out.println(sjvo.tot);
		
	}

} //class 닫기
class Rent {
	int retno;
	int bookno;
	int memberno;
	
	void showRentinfo(){
		System.out.println(retno);
		System.out.println(bookno);
		System.out.println(memberno);
	}
} // 클래스 닫기
class StaticRent { // 객체 생성 없이 클래스 사용
	static int retno;
	static int bookno;
	static int memberno;
	String rentdate;		// static으로 선언되지 않았음
	
	// 대여정보 출력 showReninfo
	static void showRentinfo(){
		System.out.println(retno);
		System.out.println(bookno);
		System.out.println(memberno);
		//System.out.println(rentdate); // 오류발생!
		// static 메서드에서는 비 static 변수는 사용불가
		// 하지만, rentdate 를 사용하고 싶다면?
		StaticRent sr =  new StaticRent();
		System.out.println(sr.rentdate);
	}
}
class subngjuk{
	int kor;
	int eng;
	int mat;
	int tot;
	
	public subngjuk(){
	}
		public subngjuk(int kor, int eng, int mat){
			this.kor = kor;
			this.eng = eng;
			this.mat = mat;
	}
	int showtot(){ return kor + eng + mat;}
	
} // 클래스 닫기
// 성적 클래스 : 성적에 관련된 데이터만  저장
// 즉 , 멤버변수만 존재 하고 그것을 처리하는 메서드는 없음  - 값만 저장하는 클래스
class sungjukvo {
	String name;
	int kor;
	int eng;
	int mat;
	int tot;
	
	// 생성자
	public sungjukvo(){}
	public sungjukvo(int kor, int eng, int mat) {
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
} // class close
// 성적데이터에 대한 총점, 평균, 학점 등을 처리하는 클래스
class sungjukservice{
	int getTotal(int kor, int eng, int mat){
		return kor + eng + mat;
	}
	static int getTotal2(int kor ,int eng,int  mat){
		return kor + eng + mat;
	}
	
} // class close